home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
System Booster
/
System Booster.iso
/
Texteditors
/
XDME
/
Src
/
command.c
< prev
next >
Wrap
C/C++ Source or Header
|
1996-09-26
|
36KB
|
1,188 lines
/******************************************************************************
MODUL
command.c
DESCRIPTION
)c single character (typing)
'c single character (typing)
`string' string of characters w/ embedded `' allowed!
(string) same thing w/ embedded () allowed!
\c override
name arg arg command name. The arguments are interpreted as
strings for the command.
$scanf macro insert scanf'd variable
$filename macro insert current file name with the complete path
$file macro insert current name filename
$path macro insert complete path of current file
$currentdir macro insert the base dir of XDME
$currentline macro insert entire contents of current line
$colno macro insert column number of cursor
$lineno macro insert line number of cursor
$margin macro insert current margin setting
$modified macro insert 0/1 modified flag
$rexxport macro insert rexx port name
Any string arguments not part of a command are considered to be typed
text.
NOTES
BUGS
TODO
EXAMPLES
SEE ALSO
INDEX
HISTORY
06. Dec 1992 ada created
******************************************************************************/
/**************************************
Includes
**************************************/
#include "defs.h"
/**************************************
Globale Variable
**************************************/
Prototype int do_command (char *);
Prototype void do_null (void);
Prototype void do_source (long);
Prototype void do_quit (void);
Prototype void do_quitall (void);
Prototype void do_execute (void);
Prototype char * breakout (char **, char *, char **);
extern int foundcmd; /* control for implicit ARexx macro invocation */
extern int cmderr; /* global command error flag for do_rexx()'s use */
/**************************************
Interne Defines & Strukturen
**************************************/
#define CF_COK 1 /* Can be executed while in command line mode */
#define CF_PAR 2 /* ESCIMM special flag.. save rest of command line */
/* so it can be executed after user entry */
#define CF_ICO 4 /* OK to execute if iconified, else uniconify first*/
#define CF_VWM 8 /* OK to execute if in viewmode, else abort */
#define BTOCP(val, type) ((type)((long)val << 2))
typedef void (*FPTR)(long);
typedef struct
{
const char * name; /* command name */
UBYTE args; /* number of arguments */
UBYTE flags; /* flags */
FPTR func; /* c-function */
} COMM;
#define MAXIA 5
/**************************************
Interne Variable
**************************************/
/* args flags */
static CONST COMM Comm[] =
{
"abort", 0, CF_VWM|CF_ICO|CF_COK, (FPTR)do_abort,
"activatefront", 1, CF_VWM|CF_COK|CF_ICO, (FPTR)do_activefront,
"add", 2, CF_VWM|CF_ICO|CF_COK, (FPTR)do_namedmathfunc,
"addpath", 1, CF_VWM|CF_ICO, (FPTR)do_addpath,
"appendsave", 1, CF_VWM|CF_COK|CF_ICO, (FPTR)do_appendsave,
"arpfont", 0, CF_VWM, (FPTR)do_aslfont,
"arpinsfile", 0, 0, (FPTR)do_aslinsfile,
"arpload", 0, CF_VWM, (FPTR)do_aslload,
"arpsave", 0, CF_VWM|CF_ICO, (FPTR)do_aslsave,
"autoindent", 1, CF_VWM|CF_ICO, (FPTR)do_autoindent,
"autosplit", 1, CF_VWM|CF_ICO, (FPTR)do_autosplit,
"autounblock", 1, CF_VWM|CF_ICO, (FPTR)do_autounblock,
"back", 0, CF_COK, (FPTR)do_bs,
"backtab", 0, CF_VWM|CF_COK, (FPTR)do_backtab,
"bappendsave", 1, CF_VWM|CF_COK|CF_ICO, (FPTR)do_bappendsave,
"barpsave", 0, CF_VWM|CF_ICO, (FPTR)do_barpsave,
"bbpen", 1, CF_VWM, (FPTR)do_bbpen,
"bcopy", 0, 0, (FPTR)do_bcopy,
"bdelete", 0, 0, (FPTR)do_bdelete,
"bend", 0, CF_VWM, (FPTR)do_block, /* checks com name for mode */
"bgpen", 1, CF_VWM, (FPTR)do_bgpen,
"block", 0, CF_VWM, (FPTR)do_block, /* checks com name for mode */
"blocktype", 1, CF_VWM, (FPTR)do_blocktype,
"bmove", 0, 0, (FPTR)do_bmove,
"bottom", 0, CF_VWM, (FPTR)do_bottom,
"break", 0, CF_VWM|CF_ICO|CF_COK, (FPTR)do_break,
"bs", 0, CF_COK, (FPTR)do_bs,
"bsave", 1, CF_VWM|CF_ICO, (FPTR)do_bsave,
"bsource", 0, CF_VWM|CF_ICO, (FPTR)do_bsource,
"bstart", 0, CF_VWM, (FPTR)do_block, /* checks com name for mode */
"cd", 1, CF_VWM|CF_ICO, (FPTR)do_cd,
"chfilename", 1, CF_VWM|CF_ICO, (FPTR)do_chfilename,
"clipins", 0, CF_COK, (FPTR)do_clipins,
"col", 1, CF_VWM|CF_COK, (FPTR)do_col,
"continue", 0, CF_VWM|CF_ICO|CF_COK, (FPTR)do_continue,
"copy", 0, CF_VWM|CF_ICO|CF_COK, (FPTR)do_copy,
"ctags", 0, CF_VWM, (FPTR)do_ctags,
"debug", 1, CF_VWM|CF_ICO, (FPTR)do_debug,
"dec", 1, CF_VWM|CF_ICO|CF_COK, (FPTR)do_namedmathfunc,
"del", 0, CF_COK, (FPTR)do_bs,
"delete", 0, CF_COK, (FPTR)do_delete,
"deline", 0, 0, (FPTR)do_deline,
"delines", 1, 0, (FPTR)do_delines,
"div", 2, CF_VWM|CF_ICO|CF_COK, (FPTR)do_namedmathfunc,
"down", 0, CF_VWM|CF_COK, (FPTR)do_down,
"downadd", 0, 0, (FPTR)do_downadd,
"esc", 0, CF_VWM|CF_COK, (FPTR)do_esc,
"escimm", 1, CF_VWM|CF_PAR, (FPTR)do_esc,
"eval", 1, CF_VWM|CF_COK, (FPTR)do_eval,
"execute", 1, CF_VWM|CF_ICO, (FPTR)do_execute,
"fgpen", 1, CF_VWM, (FPTR)do_fgpen,
#ifdef PATCH_FILTER
"filter", 4, CF_VWM|CF_COK|CF_PAR, (FPTR)do_filter,
#endif
"find", 1, CF_VWM, (FPTR)do_find, /* checks com name for mode */
"findr", 2, 0, (FPTR)do_findr, /* checks com name for mode */
"findstr", 1, CF_VWM, (FPTR)do_findstr, /* checks com name for mode */
"first", 0, CF_VWM|CF_COK, (FPTR)do_firstcolumn,
"firstnb", 0, CF_VWM|CF_COK, (FPTR)do_firstnb,
"followcursor", 1, CF_VWM|CF_COK|CF_ICO, (FPTR)do_followcursor,
"force", 2, CF_VWM|CF_COK, (FPTR)do_force,
"global", 1, CF_VWM|CF_COK|CF_ICO, (FPTR)do_global,
"goto", 1, CF_VWM, (FPTR)do_goto,
"hgpen", 1, CF_VWM, (FPTR)do_hgpen,
"iconify", 0, CF_VWM|CF_ICO, (FPTR)do_iconify,
"if", 2, CF_VWM|CF_COK|CF_ICO, (FPTR)do_if,
"ifelse", 3, CF_VWM|CF_COK|CF_ICO, (FPTR)do_if,
"ignorecase", 1, CF_VWM|CF_COK|CF_ICO, (FPTR)do_ignorecase,
"inc", 1, CF_VWM|CF_ICO|CF_COK, (FPTR)do_namedmathfunc,
"indent", 2, 0, (FPTR)do_indent,
"infixmode", 1, CF_VWM|CF_ICO|CF_COK, (FPTR)do_infixmode,
"insert", 1, CF_COK, (FPTR)do_insertwrite,
"insertmode", 1, CF_VWM|CF_COK|CF_ICO, (FPTR)do_insertmode,
"insfile", 1, 0, (FPTR)do_edit,
"insline", 0, 0, (FPTR)do_insline,
"inslines", 1, 0, (FPTR)do_inslines,
"join", 0, 0, (FPTR)do_join,
"justify", 1, 0, (FPTR)do_justify,
"keyload", 1, CF_VWM|CF_ICO, (FPTR)do_keyload, /* tester */
"keysave", 1, CF_VWM|CF_ICO, (FPTR)do_keysave, /* tester */
"last", 0, CF_VWM|CF_COK, (FPTR)do_lastcolumn,
"left", 0, CF_VWM|CF_COK, (FPTR)do_left,
"lineblock", 0, CF_VWM|CF_ICO, (FPTR)do_block,
"macroload", 1, CF_VWM|CF_ICO, (FPTR)do_macroload, /* tester */
"macrosave", 1, CF_VWM|CF_ICO, (FPTR)do_macrosave, /* tester */
"makecursorvisible", 0, CF_VWM|CF_COK, (FPTR)do_makecursorvisible,
"map", 2, CF_VWM|CF_ICO, (FPTR)do_map,
"margin", 1, CF_VWM|CF_ICO, (FPTR)do_margin,
"match", 0, CF_VWM|CF_COK, (FPTR)do_match,
"math1", 2, CF_VWM|CF_ICO|CF_COK, (FPTR)do_unnamedmathfunc,
"math2", 3, CF_VWM|CF_ICO|CF_COK, (FPTR)do_unnamedmathfunc,
"menuadd", 3, CF_VWM|CF_ICO, (FPTR)do_itemadd,
"menubar", 1, CF_VWM|CF_ICO, (FPTR)do_itembar,
"menucheck", 3, CF_VWM|CF_ICO, (FPTR)do_itemcheck,
"menuclear", 0, CF_VWM|CF_ICO, (FPTR)do_menuclear,
"menudel", 2, CF_VWM|CF_ICO, (FPTR)do_delitem,
"menudelbar", 1, CF_VWM|CF_ICO, (FPTR)do_delitembar,
"menudelhdr", 1, CF_VWM|CF_ICO, (FPTR)do_delmenu,
"menudelsub", 3, CF_VWM|CF_ICO, (FPTR)do_delsub,
"menudelsubar", 2, CF_VWM|CF_ICO, (FPTR)do_delsubbar,
"menugetcheck", 3, CF_VWM|CF_ICO, (FPTR)do_getcheckitem,
"menugetscheck", 4, CF_VWM|CF_ICO, (FPTR)do_getchecksub,
"menuload", 1, CF_VWM|CF_ICO, (FPTR)do_menuload, /* tester */
"menuoff", 0, CF_VWM|CF_ICO, (FPTR)do_menuoff,
"menuon", 0, CF_VWM|CF_ICO, (FPTR)do_menuon,
"menusave", 1, CF_VWM|CF_ICO, (FPTR)do_menusave, /* tester */
"menusetcheck", 3, CF_VWM|CF_ICO, (FPTR)do_setcheckitem,
"menusetscheck", 4, CF_VWM|CF_ICO, (FPTR)do_setchecksub,
"menusubadd", 4, CF_VWM|CF_ICO, (FPTR)do_subadd,
"menusubbar", 2, CF_VWM|CF_ICO, (FPTR)do_subbar,
"menusubcheck", 4, CF_VWM|CF_ICO, (FPTR)do_subcheck,
"mod", 2, CF_VWM|CF_ICO|CF_COK, (FPTR)do_namedmathfunc,
"modified", 1, CF_ICO, (FPTR)do_modified,
"mul", 2, CF_VWM|CF_ICO|CF_COK, (FPTR)do_namedmathfunc,
"neg", 1, CF_VWM|CF_ICO|CF_COK, (FPTR)do_namedmathfunc,
"newfile", 1, CF_VWM, (FPTR)do_edit, /* checks com name for mode */
"newkeytable", 1, CF_VWM|CF_ICO|CF_COK, (FPTR)do_new_keytable,
"newmenustrip", 1, CF_VWM|CF_ICO|CF_COK, (FPTR)do_new_menustrip,
"newwindow", 0, CF_VWM|CF_ICO, (FPTR)do_newwindow,
"next", 0, CF_VWM, (FPTR)do_find,
"nextr", 0, 0, (FPTR)do_findr,
"not", 1, CF_VWM|CF_ICO|CF_COK, (FPTR)do_namedmathfunc,
"null", 0, CF_VWM|CF_COK, (FPTR)do_null,
"openwindow", 1, CF_VWM|CF_ICO, (FPTR)do_openwindow,
"overwrite", 1, CF_COK, (FPTR)do_insertwrite,
"pagedown", 0, CF_VWM, (FPTR)do_page,
"pageleft", 0, CF_VWM, (FPTR)do_page,
"pageright", 0, CF_VWM, (FPTR)do_page,
"pageset", 1, CF_VWM|CF_ICO, (FPTR)do_page,
"pageup", 0, CF_VWM, (FPTR)do_page,
"pattern", 1, CF_VWM|CF_COK|CF_ICO, (FPTR)do_pattern,
"peek", 1, CF_VWM|CF_COK|CF_ICO, (FPTR)do_pop,
"pickvar", 1, CF_VWM|CF_COK|CF_ICO, (FPTR)do_pickVAR,
"ping", 1, CF_VWM|CF_ICO, (FPTR)do_ping,
"pong", 1, CF_VWM, (FPTR)do_pong,
"pop", 1, CF_VWM|CF_COK|CF_ICO, (FPTR)do_pop,
"popvar", 1, CF_VWM|CF_COK|CF_ICO, (FPTR)do_popVAR,
"port", 2, CF_VWM|CF_ICO, (FPTR)to_port, /* HD Rexx */
"prev", 0, CF_VWM, (FPTR)do_find,
"prevr", 0, 0, (FPTR)do_findr,
"projectinfo", 0, CF_VWM|CF_ICO, (FPTR)project_info, /* HD */
"projectload", 0, CF_VWM|CF_ICO, (FPTR)load_project, /* HD */
"projectsave", 0, CF_VWM|CF_ICO, (FPTR)save_project, /* HD */
"pubscreen", 1, CF_VWM|CF_ICO, (FPTR)set_pubscreen,
"purgevar", 1, CF_VWM|CF_COK|CF_ICO, (FPTR)do_purgeVAR,
"push", 1, CF_VWM|CF_COK|CF_ICO, (FPTR)do_push,
"pushvar", 1, CF_VWM|CF_COK|CF_ICO, (FPTR)do_pushVAR,
"qualifier", 1, CF_VWM|CF_ICO|CF_COK, (FPTR)do_qualifier,
"quiet", 1, CF_VWM|CF_ICO|CF_COK, (FPTR)do_quiet,
"quit", 0, CF_VWM|CF_ICO, (FPTR)do_quit,
"quitall", 0, CF_VWM|CF_ICO, (FPTR)do_quitall,
"recall", 0, CF_VWM, (FPTR)do_recall,
"recend", 0, CF_VWM|CF_ICO|CF_COK, (FPTR)end_recording, /* it is recommended to end a record by pressing Ctl-C */
"recplay", 0, CF_VWM|CF_ICO|CF_COK, (FPTR)replay_record,
"recsave", 1, CF_VWM|CF_ICO|CF_COK, (FPTR)do_saverecord,
"recstart", 0, CF_VWM|CF_ICO|CF_COK, (FPTR)start_recording,
"redisplay", 0, CF_VWM, (FPTR)do_redisplay,
"ref", 0, CF_VWM|CF_ICO, (FPTR)do_refs,
"refctags", 0, CF_VWM|CF_ICO, (FPTR)do_refctags,
"reformat", 0, 0, (FPTR)do_reformat,
"rem", 1, CF_VWM|CF_ICO|CF_COK, (FPTR)do_null, /* comments in lines */
"remeol", 0, CF_VWM|CF_COK, (FPTR)do_remeol,
"remkeytable", 1, CF_VWM|CF_ICO|CF_COK, (FPTR)do_del_keytable,
/* "remmenustrip", 1, CF_VWM|CF_ICO|CF_COK, (FPTR)do_del_menustrip, */ /* that function is not stable yet */
"rempath", 1, CF_VWM|CF_COK|CF_ICO, (FPTR)do_rempath,
"repeat", 2, CF_VWM|CF_COK|CF_ICO, (FPTR)do_repeat,
"replace", 0, 0, (FPTR)do_replace,
"repstr", 1, CF_VWM|CF_ICO, (FPTR)do_findstr,
"reqfont", 0, CF_VWM, (FPTR)do_reqfont,
"reqinsfile", 0, 0, (FPTR)do_reqinsfile,
"reqload", 0, CF_VWM, (FPTR)do_reqload,
"reqsave", 0, CF_VWM|CF_ICO, (FPTR)do_reqsave,
"resettoggle", 1, CF_VWM|CF_COK|CF_ICO, (FPTR)do_toggle,
"resize", 2, CF_VWM, (FPTR)do_resize,
"ret", 0, CF_VWM|CF_ICO|CF_COK, (FPTR)do_retmacro,
"return", 0, CF_COK, (FPTR)do_return, /* special meaning in command line mode */
"right", 0, CF_VWM|CF_COK, (FPTR)do_right,
"rx", 1, CF_VWM|CF_ICO, (FPTR)do_rx, /* explicit ARexx macro invocation */
"rx1", 2, CF_VWM|CF_ICO, (FPTR)do_rx1, /* explicit, with 1 arg to ARexx macro */
"rx2", 3, CF_VWM|CF_ICO, (FPTR)do_rx2, /* explicit, with 2 args to ARexx macro */
"rxresult", 1, CF_VWM|CF_ICO, (FPTR)put_rexx_result,
#ifdef PATCH_RXVARS
"rxset", 2, CF_VWM|CF_COK|CF_ICO, (FPTR)do_setrexx, /* explicit, with 1 arg to ARexx macro */
#endif /* PATCH_RXVARS */
"saveas", 1, CF_VWM|CF_COK|CF_ICO, (FPTR)do_saveas,
"saveconfig", 0, CF_VWM|CF_COK|CF_ICO, (FPTR)do_saveconfig,
// "savemap", 1, CF_VWM|CF_COK|CF_ICO, (FPTR)do_savemap, /* checks com name for mode */
"saveold", 0, CF_VWM|CF_COK|CF_ICO, (FPTR)do_save,
// "savesmap", 1, CF_VWM|CF_COK|CF_ICO, (FPTR)do_savemap,
"savetabs", 1, CF_VWM|CF_COK|CF_ICO, (FPTR)do_savetabs,
"scanf", 1, CF_VWM|CF_COK|CF_ICO, (FPTR)do_scanf,
"screenbottom", 0, CF_VWM, (FPTR)do_screenbottom,
"screentop", 0, CF_VWM, (FPTR)do_screentop,
"scrolldown", 0, CF_VWM, (FPTR)do_scrolldown,
"scrollleft", 0, CF_VWM, (FPTR)do_scroll,
"scrollright", 0, CF_VWM, (FPTR)do_scroll,
"scrollup", 0, CF_VWM, (FPTR)do_scrollup,
"select", 1, CF_VWM|CF_ICO, (FPTR)select_window, /* HD Rexx */
"set", 2, CF_VWM|CF_COK|CF_ICO, (FPTR)do_set,
"setenv", 2, CF_VWM|CF_COK|CF_ICO, (FPTR)do_setenv,
"setfont", 2, CF_VWM, (FPTR)do_setfont,
"setgeometry", 4, CF_VWM, (FPTR)do_setgeometry,
"setmacro", 3, CF_VWM|CF_ICO|CF_COK, (FPTR)do_setmacro,
"setmacrovar", 2, CF_VWM|CF_ICO|CF_COK, (FPTR)do_setmacrovar,
"setparcol", 1, CF_VWM|CF_COK|CF_ICO, (FPTR)do_setparcol,
"settoggle", 1, CF_VWM|CF_COK|CF_ICO, (FPTR)do_toggle,
"settvar", 2, CF_VWM|CF_ICO|CF_COK, (FPTR)do_settvar,
"sizewindow", 1, CF_VWM|CF_COK, (FPTR)do_sizewindow,
"showlog", 0, CF_VWM|CF_ICO|CF_COK, (FPTR)do_showlog,
"smv", 2, CF_VWM|CF_ICO|CF_COK, (FPTR)do_setmacrovar,
"source", 1, CF_VWM|CF_COK|CF_ICO, (FPTR)do_source,
"sourcebreaks", 1, CF_VWM|CF_COK|CF_ICO, (FPTR)do_sourcebreak,
"spacing", 1, CF_VWM, (FPTR)do_setlinedistance,
"split", 0, 0, (FPTR)do_split,
"sub", 2, CF_VWM|CF_ICO|CF_COK, (FPTR)do_namedmathfunc,
"swap", 1, CF_VWM|CF_COK|CF_ICO, (FPTR)do_swap,
"swapvar", 1, CF_VWM|CF_COK|CF_ICO, (FPTR)do_swapVAR,
"tab", 0, CF_VWM|CF_COK, (FPTR)do_tab,
"tabstop", 1, CF_VWM|CF_COK|CF_ICO, (FPTR)do_tabstop,
"taskpri", 1, CF_VWM|CF_COK|CF_ICO, (FPTR)do_taskpri,
"title", 1, CF_VWM|CF_ICO, (FPTR)do_title,
"tlate", 1, CF_COK, (FPTR)do_tlate,
"toback", 0, CF_VWM|CF_COK|CF_ICO, (FPTR)do_toback,
"tofront", 0, CF_VWM|CF_COK|CF_ICO, (FPTR)do_tofront,
"toggle", 1, CF_VWM|CF_COK|CF_ICO, (FPTR)do_toggle,
"tomouse", 0, CF_VWM, (FPTR)do_tomouse,
"top", 0, CF_VWM, (FPTR)do_top,
"tpen", 1, CF_VWM, (FPTR)do_tpen,
"unabort", 0, CF_VWM|CF_ICO|CF_COK, (FPTR)do_unabort,
"unblock", 0, CF_VWM|CF_ICO, (FPTR)do_block,
"undeline", 0, 0, (FPTR)do_undeline,
"undo", 0, 0, (FPTR)do_undo,
"uniconify", 0, CF_VWM|CF_ICO, (FPTR) uniconify, /* PATCH_NULL [14 Feb 1993] : added */
"unjustify", 0, 0, (FPTR)do_unjustify,
"unmap", 1, CF_VWM|CF_COK|CF_ICO, (FPTR)do_unmap,
"unset", 1, CF_VWM|CF_COK|CF_ICO, (FPTR)do_unset,
"unsetenv", 1, CF_VWM|CF_COK|CF_ICO, (FPTR)do_unsetenv,
"unsetmacro", 1, CF_VWM|CF_ICO|CF_COK, (FPTR)do_unsetmacro,
"unsetmacrovar", 1, CF_VWM|CF_ICO|CF_COK, (FPTR)do_unsetmacrovar,
"unsettvar", 1, CF_VWM|CF_ICO|CF_COK, (FPTR)do_unsettvar,
"up", 0, CF_VWM|CF_COK, (FPTR)do_up,
"usekeytable", 1, CF_VWM|CF_ICO|CF_COK, (FPTR)do_use_keytable,
"usemenustrip", 1, CF_VWM|CF_ICO|CF_COK, (FPTR)do_use_menustrip,
"vctags", 1, CF_VWM|CF_ICO, (FPTR)do_ctags,
"viewmode", 1, CF_VWM|CF_COK|CF_ICO, (FPTR)do_viewmode,
"vref", 1, CF_VWM|CF_ICO, (FPTR)do_refs,
"vrefctags", 1, CF_VWM|CF_ICO, (FPTR)do_refctags,
"while", 2, CF_VWM|CF_COK|CF_ICO, (FPTR)do_if,
"windowcycling", 1, CF_VWM|CF_COK|CF_ICO, (FPTR)do_windowcyc,
"wleft", 0, CF_VWM|CF_COK, (FPTR)do_wleft,
"wordwrap", 1, CF_VWM|CF_COK|CF_ICO, (FPTR)do_wordwrap,
"wright", 0, CF_VWM|CF_COK, (FPTR)do_wright,
"writeto", 1, CF_VWM|CF_COK|CF_ICO, (FPTR)do_writeto,
};
static CONST COMM repcmd =
{
"repeat", 2, CF_COK|CF_ICO, (FPTR)do_repeat,
};
/**************************************
Interne Prototypes
**************************************/
int do_command (char * str)
{
char * arg;
char * aux1,
* aux2,
* repstr[MAXIA];
char quoted;
WORD repi = 0;
long j;
WORD low;
WORD high;
WORD diff;
static int level = 0;
COMM * comm;
#define DEBUG_FILE /* Logging on ? */
#ifdef DEBUG_FILE
static FILE * debug_file = NULL;
if (!debug_file && globalflags.debug)
debug_file = fopen ("t:XDME.debug", "w");
#endif
if (!str || !*str)
return (1);
#ifdef DEBUG_FILE
if (debug_file && globalflags.debug)
fprintf (debug_file, "%s\n", str);
#endif
if (globalflags.debug) printf("dcom[%2d|%d]: %s\n", level+1, globalflags.Abortcommand, str);
if (MacroRecord != 0 && level == 0) { /* PATCH_NULL [14 Feb 1993] : added */
add_record (str); /* PATCH_NULL [14 Feb 1993] : added */
} /* if */ /* PATCH_NULL [14 Feb 1993] : added */
if (++level > 20)
{
error ("command:\nRecursion too deep");
--level;
foundcmd = 1; /* to prevent us from trying an ARexx macro */
return (0);
}
while ((arg = breakout (&str, "ed, &aux1)) &&
!(LoopBreak || LoopCont) ) /* PATCH_BREAK - should be put together */
{
if (globalflags.debug) printf("loop[%2d|%d] CHECK %s\n",level, globalflags.Abortcommand, arg);
if (quoted)
{
if (globalflags.debug) printf("loop[%2d|%d] write %s\n",level, globalflags.Abortcommand, arg);
if (Ep->viewmode && !globalflags.Comlinemode) /* PATCH_NULL */
{
if (globalflags.debug) printf("-- viewmode");
goto fail; /* PATCH_NULL */
} /* if */ /* PATCH_NULL */
if (Ep->iconmode)
uniconify ();
text_write (arg);
goto loop;
} /* if (quoted) */
if (isalpha (*arg))
{
low = 0;
high = sizeof(Comm)/sizeof(Comm[0]) - 1;
do
{
j = (low + high)/2;
diff = stricmp (arg, Comm[j].name);
if (!diff)
break;
if (diff < 0)
high = j-1;
else
low = j+1;
} while (low <= high);
if (!diff)
{
if (globalflags.debug) printf("loop[%2d|%d] comm %s\n",level, globalflags.Abortcommand, arg);
comm = &Comm[j];
foundcmd = 1;
av[0] = (UBYTE *)comm->name;
for (j=1; j<=comm->args; j++)
{
av[j] = (UBYTE *)breakout (&str, "ed, &aux2);
if (aux2)
{
if (repi == MAXIA)
{
free (aux2);
error ("command:\nToo many args for\n%s", av[0]);
if (globalflags.debug) printf("-- varargs Oflow");
goto fail;
} else
{
repstr[repi ++] = aux2;
}
}
if (!av[j])
{
if (j < 2)
error ("command:\nBad argument %ld of\n%s", j, av[0]);
else
error ("command:\nBad argument %ld of\n%s %s", j, av[0], av[1]);
if (globalflags.debug) printf("-- less args");
goto fail;
}
} /* for all args */
av[j] = NULL; /* end of arglist */
process:
if ((comm->flags & CF_COK) || !globalflags.Comlinemode)
{
if (Ep->viewmode && !globalflags.Comlinemode && !(comm->flags & CF_VWM)) /* PATCH_NULL */
{
if (globalflags.debug) printf("-- viewmode");
goto fail; /* PATCH_NULL */
} /* if */ /* PATCH_NULL */
if (comm->flags & CF_PAR)
{
if (Partial)
free (Partial);
Partial = (char *)malloc (strlen (str) + 1);
strcpy (Partial, str);
str += strlen(str); /* skip string */
} /* if CF_PAR */
if (Ep->iconmode && !(comm->flags & CF_ICO))
uniconify ();
if (globalflags.debug) printf ("comm[%2d|%d] %s/%s\n", level, globalflags.Abortcommand, av[0], av[1]);
(*comm->func)(-1);
} /* if CF_COK or Not Comlinemode */
if (globalflags.Abortcommand)
{
if (globalflags.debug) printf("-- aborted");
goto fail;
}
goto loop;
} /* if arg == command */
} else if (isdigit(*arg))
{
av[0] = "repeat";
av[1] = arg;
av[2] = (UBYTE *)breakout(&str, "ed, &aux2);
if (aux2)
{
repstr[repi ++] = aux2;
}
if (globalflags.debug) printf("-- repeat");
if (!av[2])
{
error ("command:\nBad second argument\nfor short-repeat");
goto fail;
}
av[3] = 0;
comm = &repcmd;
goto process;
} /* Repeat */
{
/*
** Search for a macro - we had to put that scan
** before the checks for menus and keys, as
** keys are only checked up to 3 chars
*/
void * macro;
int ret;
if (macro = (void*)getmacro(arg))
{
int narg = nummacroargs (macro);
/* av[0] = (CHAR *)((NODE*)macro)->ln_Name; */
if (globalflags.debug) printf("loop[%2d|%d] macro %s\n",level, globalflags.Abortcommand, arg);
av[0] = NULL;
foundcmd = 1;
for (j = 1; j <= narg; ++j)
{
av[j] = (UBYTE *)breakout (&str, "ed, &aux2);
if (aux2)
{
if (repi == MAXIA)
{
free(aux2);
error ("macro:\nToo many args for\n%s", av[0]);
if (globalflags.debug) printf("-- M:varargs Oflow");
goto fail;
} else
{
repstr[repi++] = aux2;
}
}
if (!av[j])
{
error ("macro:\nBad argument %ld of\n%s", j, av[0]);
if (globalflags.debug) printf("-- M:less args");
goto fail;
}
}
av[j] = NULL; /* end of arglist */
if (globalflags.debug) printf ("mac [%2d|%d] %s/%s\n", level, globalflags.Abortcommand, arg, av[1]);
ret = callmacro(macro);
if (!ret)
{
if (globalflags.debug) printf("-- M:abort");
goto fail;
} /* if no succ */
goto loop;
} /* if */
} /* block */
/* Command not found, check for macro */
{
char * cmdstr;
int ret;
if ((cmdstr = keyspectomacro(arg)) || (cmdstr = menutomacro(arg)))
{
cmdstr = strdup (cmdstr);
if (globalflags.debug) printf ("loop[%2d|%d] key %s\n", level, globalflags.Abortcommand, cmdstr);
ret = do_command (cmdstr);
free (cmdstr);
if (ret)
{
foundcmd = 1;
goto loop;
}
if (globalflags.debug) printf("-- K:abort");
goto fail;
} /* if arg is macro or menu */
}
/*
*! PATCH_JUX (reine gaudi)
*!
*! Direct assignments of existing vars
*! With that patch something is possible like:
*! set abc 1 ... abc = 3 (instead of set abc 3)
*!
*! if arg1 is a "=" we search for a variable of the name in arg0
*! if there is such a variable, we assign its value to the value
*! in arg2 (the correct types are used)
*!
*! But what shall we do, if there was not such a variable???
*/
{
char * dummy/* = NULL dead assign */;
int type = VAR_NEX;
dummy = str;
while (*dummy && *dummy <33)
{
dummy ++;
} /* while */
if (*dummy == '=')
{
dummy ++;
str = dummy;
dummy = GetTypedVar (arg, &type);
if (dummy)
{
free (dummy);
dummy = breakout (&str, "ed, &aux2);
if (!dummy)
{
error ("Assignment without value");
goto fail;
} /* if */
SetTypedVar (arg, dummy, type);
if (aux2)
{
free (aux2);
} /* if */
goto loop;
} else
{ /* there is no variable of the given name - WAS sollen wir jetzt machen ? einen Default verwenden ??? */
} /* if */
} /* if */
} /* block direct assignment */
/* Command still not found, check for public macro */
/* code to be added */
if (do_rxImplied (arg, str))
error ("command:\nUnknown command\n`%s'", arg);
if (globalflags.debug) printf("running into fail");
fail:
if (globalflags.debug) printf ("fail[%2d|%d]\n", level, globalflags.Abortcommand);
--level;
while (--repi >= 0)
free (repstr[repi]);
if (aux1) free (aux1);
return(0);
loop:
if (aux1) free (aux1);
// aux1 = NULL; /* PATCH_BREAK - is not necessary */
} /* while (arg) */
/* ret_ok: - point is not necessary */
if (globalflags.debug) printf ("ret1[%2d|%d]\n", level, globalflags.Abortcommand);
--level;
while (--repi >= 0)
free (repstr[repi]);
// if (aux1) free (aux1); /* PATCH_BREAK - is not necessary */
return(1);
} /* do_command */
void do_null (void)
{
} /* do_null */
void do_source (long do_err)
{
char buf[MAXLINELEN];
FILE * fi;
char * str;
BPTR oldlock = CurrentDir(DupLock(Ep->dirlock));
if (fi = fopen(av[1], "r"))
{
while (fgets(buf, MAXLINELEN, fi))
{
if (buf[0] == '#')
continue;
for (str = buf; *str; ++str)
{
if (*str == 9)
*str = ' ';
}
if (str > buf && str[-1] == '\n')
str[-1] = 0;
do_command(buf);
if (globalflags.SourceBreaks) /* PATCH_NULL */
{
if (globalflags.Abortcommand || LoopBreak || LoopCont) /* PATCH_NULL */
{
break; /* PATCH_NULL */
} /* if */ /* PATCH_NULL */
} else /* PATCH_NULL */
{
globalflags.Abortcommand = 0; /* PATCH_NULL */
LoopBreak = 0; /* PATCH_NULL */
LoopCont = 0; /* PATCH_NULL */
} /* if */ /* PATCH_NULL */
}
fclose(fi);
} else
{
if (do_err)
{
error ("source:\nFile `%s'\nnot found", av[1]);
}
}
UnLock(CurrentDir(oldlock));
} /* do_source */
void do_quit (void)
{
globalflags.Quitflag = 1;
ActivateWindow (Ep->win); /* HD damit aus AREXX */
} /* do_quit */
void do_quitall (void)
{
globalflags.Quitflag = 1;
globalflags.QuitAll = 1;
ActivateWindow (Ep->win); /* HD damit aus AREXX */
} /* do_quitall */
void do_execute (void)
{
BPTR oldlock = CurrentDir (Ep->dirlock);
BPTR NilFH;
PROC * proc = (PROC *)FindTask (NULL);
NilFH = Open ("NIL:", 1006);
if (NilFH)
{
void *oldConsoleTask = proc->pr_ConsoleTask;
proc->pr_ConsoleTask = (APTR)BTOCP(NilFH, struct FileHandle *)->fh_Port;
Execute (av[1], NilFH, NilFH);
proc->pr_ConsoleTask = oldConsoleTask;
Close(NilFH);
} else
{
error ("execute:\nNIL:-device required");
}
CurrentDir(oldlock);
} /* do_execute */
/*
* BREAKOUT()
*
* Break out the next argument. The argument is space delimited and
* might be quoted with `' or (), or single quoted as 'c or )c
*
* Also: $var -variable insertion
* ^c -control character
*/
char * breakout (char ** ptr, char * quoted, char ** paux)
{
char * str = *ptr;
char * base;
WORD count; /* Level of brace */
char opc; /* Open-Char */
char clc; /* Close-Char */
char immode;
char isaux;
char buf[MAXLINELEN];
WORD di, i;
/* if (debug) printf("bout[ |%d] ? %s\n", globalflags.Abortcommand, str); */
count =
opc =
clc =
immode=
isaux =
di = 0;
*quoted = 0;
if (paux)
*paux = NULL;
while (*str == ' ')
++str;
if (!*str)
return (NULL);
*ptr = str;
base = str;
while (*str)
{
if (immode)
{
if (di != sizeof(buf)-1)
buf[di++] = *str;
str ++;
continue;
}
if (count == 0)
{
if (*str == ' ')
break;
if (*str == '\'' || *str == ')')
clc = *str;
else if (*str == '`')
{
opc = '`';
clc = '\'';
} else if (*str == '(')
{
opc = '(';
clc = ')';
}
}
if (*str == opc)
{
count ++;
if (str == *ptr)
{
*quoted = 1;
base = ++ str;
continue;
}
}
if (*str == clc)
{
count --;
if (count == 0 && *quoted) /* end of argument */
break;
if (str == *ptr && count < 0)
{
immode = 1;
*quoted = 1;
base = ++str;
continue;
}
}
/*
* $varname $(varname) $`varname'. I.E. three forms are allowed,
* which allows one to insert the string almost anywhere. The
* first form names are limited to alpha-numerics, '-', and '_'.
*/
if (*str == '$')
{
char * ptr2;
char * tmpptr;
char c,
ce;
WORD len;
/* if (debug) printf("bout[ |%d] $ %s\n", globalflags.Abortcommand, str); */
ce = 0; /* first form */
str ++; /* skip $ */
if (*str == '(') /* second form */
{
ce = ')';
++str;
} else if (*str == '`') /* third form */
{
ce = '\'';
++str;
}
ptr2 = str; /* start of varname */
if (ce) /* until end char OR */
{
while (*ptr2 && *ptr2 != ce)
ptr2 ++;
} else /* smart end-varname */
{
while (isalnum(*ptr2) || *ptr2 == '-' || *ptr2 == '_' )
{
ptr2 ++;
}
}
len = ptr2 - str; /* length of variable */
c = *ptr2; *ptr2 = 0; /* temp. terminate \0 */
/* if (debug) printf("bout[ |%d] var '%s'\n", globalflags.Abortcommand, str); */
if (stricmp(str, "currentdir") == 0)
{
*ptr2 = c;
isaux = 1;
if (NameFromLock(Ep->dirlock, tmp_buffer, sizeof(tmp_buffer)))
{
i = strlen(tmp_buffer);
if (di + i < sizeof(buf)-1)
{
strcpy (buf + di, tmp_buffer);
di += i;
}
}
str += len;
if (ce)
++str;
continue;
} else if (stricmp(str, "path") == 0)
{
*ptr2 = c;
isaux = 1;
if (NameFromLock(Ep->dirlock, tmp_buffer, sizeof(tmp_buffer)))
{
i = strlen (tmp_buffer);
if (di + i < sizeof(buf)-1)
{
strcpy (buf+di, tmp_buffer);
di += i;
}
}
str += len;
if (ce)
++str;
continue;
} else if (stricmp(str, "file") == 0)
{
i = strlen(Ep->name);
*ptr2 = c;
isaux = 1;
if (di + i < sizeof(buf)-1)
{
movmem(Ep->name, buf + di, i);
di += i;
buf[di] = 0;
}
str += len;
if (ce)
++str;
continue;
} else if (stricmp(str, "filename") == 0)
{
*ptr2 = c;
isaux = 1;
if (NameFromLock(Ep->dirlock, tmp_buffer, sizeof(tmp_buffer)))
{
if (AddPart (tmp_buffer, Ep->name, sizeof(tmp_buffer)))
{
i = strlen (tmp_buffer);
if (di + i < sizeof(buf)-1)
{
strcpy(buf + di, tmp_buffer);
di += i;
}
}
}
str += len;
if (ce)
++str;
continue;
} else if (!stricmp(str, "rexxport")) /* TJM */
{
*ptr2 = c;
isaux = 1;
if (di + strlen(RexxPortName) < sizeof(buf)-1)
{
strcpy(buf + di, RexxPortName);
di += strlen(buf + di);
}
str += len;
if (ce)
++str;
continue;
} else if (!stricmp(str, "rxresult"))
{
*ptr2 = c;
isaux = 1;
if (di + strlen(get_rexx_result()) < sizeof(buf)-1)
{
strcpy(buf + di, get_rexx_result());
di += strlen(buf + di);
}
str += len;
if (ce)
++str;
continue;
} else if (tmpptr = getvar(str))
{
ptr2 = tmpptr;
str[len] = c;
isaux = 1;
if (di + strlen(ptr2) < sizeof(buf)-1)
{
strcpy(buf + di, ptr2);
di += strlen(buf + di);
}
str += len;
if (ce)
++str;
free(ptr2);
continue;
}
*ptr2 = c;
str --;
if (ce)
str --;
} else if (*str == '^' && (str[1] & 0x1F)) /* CTRL-sequence */
{
str ++;
*str &= 0x1F;
isaux = 1;
} else if (*str == '\\' && str[1])
{
/* reverted to old code */
#ifdef NOTDEF
if (!count) /* ignore \ */
{
str ++;
} else if (*quoted && count == 1) /* remove it, but check next char */
{
#endif
str ++;
#ifdef NOTDEF
isaux = 1;
continue;
} else /* don't remove it, but also ignore next char */
{
buf[di ++] = *str ++;
}
#endif
isaux = 1;
}
buf[di ++] = *str ++;
} /* while (*str) */
buf[di ++] = 0;
if (isaux)
{
*paux = malloc (di);
strcpy (*paux, buf);
base = *paux;
}
if (*str) /* space ended */
{
*str = '\0';
*ptr = str + 1; /* next arg */
} else
{
*ptr = str; /* last arg */
}
return (base);
} /* breakout */
/******************************************************************************
***** ENDE command.c
******************************************************************************/